home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / net / getnetent.c < prev    next >
C/C++ Source or Header  |  1988-07-25  |  2KB  |  117 lines

  1. /*
  2.  * Copyright (c) 1983 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted
  6.  * provided that this notice is preserved and that due credit is given
  7.  * to the University of California at Berkeley. The name of the University
  8.  * may not be used to endorse or promote products derived from this
  9.  * software without specific prior written permission. This software
  10.  * is provided ``as is'' without express or implied warranty.
  11.  */
  12.  
  13. #if defined(LIBC_SCCS) && !defined(lint)
  14. static char sccsid[] = "@(#)getnetent.c    5.4 (Berkeley) 3/7/88";
  15. #endif /* LIBC_SCCS and not lint */
  16.  
  17. #include <stdio.h>
  18. #include <sys/types.h>
  19. #include <sys/socket.h>
  20. #include <netdb.h>
  21. #include <ctype.h>
  22.  
  23. #define    MAXALIASES    35
  24.  
  25. static char NETDB[] = "/etc/networks";
  26. static FILE *netf = NULL;
  27. static char line[BUFSIZ+1];
  28. static struct netent net;
  29. static char *net_aliases[MAXALIASES];
  30. int _net_stayopen;
  31. static char *any();
  32.  
  33. extern u_long inet_network();
  34.  
  35. setnetent(f)
  36.     int f;
  37. {
  38.     if (netf == NULL)
  39.         netf = fopen(NETDB, "r" );
  40.     else
  41.         rewind(netf);
  42.     _net_stayopen |= f;
  43. }
  44.  
  45. endnetent()
  46. {
  47.     if (netf) {
  48.         fclose(netf);
  49.         netf = NULL;
  50.     }
  51.     _net_stayopen = 0;
  52. }
  53.  
  54. struct netent *
  55. getnetent()
  56. {
  57.     char *p;
  58.     register char *cp, **q;
  59.  
  60.     if (netf == NULL && (netf = fopen(NETDB, "r" )) == NULL)
  61.         return (NULL);
  62. again:
  63.     p = fgets(line, BUFSIZ, netf);
  64.     if (p == NULL)
  65.         return (NULL);
  66.     if (*p == '#')
  67.         goto again;
  68.     cp = any(p, "#\n");
  69.     if (cp == NULL)
  70.         goto again;
  71.     *cp = '\0';
  72.     net.n_name = p;
  73.     cp = any(p, " \t");
  74.     if (cp == NULL)
  75.         goto again;
  76.     *cp++ = '\0';
  77.     while (*cp == ' ' || *cp == '\t')
  78.         cp++;
  79.     p = any(cp, " \t");
  80.     if (p != NULL)
  81.         *p++ = '\0';
  82.     net.n_net = inet_network(cp);
  83.     net.n_addrtype = AF_INET;
  84.     q = net.n_aliases = net_aliases;
  85.     if (p != NULL) 
  86.         cp = p;
  87.     while (cp && *cp) {
  88.         if (*cp == ' ' || *cp == '\t') {
  89.             cp++;
  90.             continue;
  91.         }
  92.         if (q < &net_aliases[MAXALIASES - 1])
  93.             *q++ = cp;
  94.         cp = any(cp, " \t");
  95.         if (cp != NULL)
  96.             *cp++ = '\0';
  97.     }
  98.     *q = NULL;
  99.     return (&net);
  100. }
  101.  
  102. static char *
  103. any(cp, match)
  104.     register char *cp;
  105.     char *match;
  106. {
  107.     register char *mp, c;
  108.  
  109.     while (c = *cp) {
  110.         for (mp = match; *mp; mp++)
  111.             if (*mp == c)
  112.                 return (cp);
  113.         cp++;
  114.     }
  115.     return ((char *)0);
  116. }
  117.